_Pragma("once");

#include "Editor.h"

/**
 * 数字编辑器
 *
 * @author lizb
 */

template <class T>
class NumberEditor :public Editor<T> {
public:
    /**
     * @param lineNum     起始行数		从0开始
     * @param startPos    起始位置（列） 从0开始
     * @param endPos      结束位置（列） 从0开始
     * @param minVal      可设最小值
     * @param mMaxVal     可设最大值
     * @param setInterval 单次调整的间隔n
     */
    NumberEditor(int lineNum, int startPos, int endPos, const T& min,const  T& max, const T& step) : Editor<T>(lineNum, startPos, endPos, EditorType::NUMBER, step),maxVal(max), minVal(min) {
        if (min > max) {
            throw std::invalid_argument("minVal cannot be larger than maxVal");
        }

        this->setValue(this->value);
    }

    /**
     * @param minVal      可设最小值
     * @param mMaxVal     可设最大值
     * @param setInterval 单次调整的间隔n
     */
    NumberEditor(int minVal, int maxVal, int step) : NumberEditor(0, 0, 6, minVal, maxVal, step) {
    }


    ~NumberEditor() {
    }


    bool setValueByRange(const T& val) override {
        bool result = false;
        if (this->value == val) {
            result = false;
        } else if (minVal <= val && maxVal >= val) {

            Editor<T>::setValueByRange(val);

            result = true;
        } else {
            result = false;
        }

        return result;
    }

protected:

    const T maxVal;
    const T minVal;
};


using IntEditor = NumberEditor<int>;


